package mybox.engine.heliostat;

import java.io.IOException;

import mybox.engine.Circle;
import mybox.engine.Figur;
import mybox.engine.File4Qcad;
import mybox.engine.PlatteOOExt;
import mybox.engine.QVector;
import mybox.engine.Rectangle;
import mybox.engine.SchachtelExt;
import mybox.engine.servo.Servo;
import mybox.engine.servo.ServoKorpus;

public class Heliostat implements Figur{
	
	File4Qcad file4qcad ;		
	double materialDicke;	
	double zinkungsFaktor;
	double laserBreite;
	double aufhaengungsLaenge;
	QVector drawPos;
	
	SchachtelExt azimuthBox;
	SchachtelExt elevationBox;
	SchachtelExt spiegelBox;
	Rectangle verbindungsRechteck;
	SchachtelExt gegenGewichtBox;
	Servo     azimuthServo,elevationServo;
	
	
	
	public GegenGewicht gegenGewicht;
	
	private double spiegelGewicht;
	private double spiegelDicke;
	private double gegenFreiraum;
	
	public Circle[] deckelLoch = new Circle[2];
	
	public Heliostat(File4Qcad file4qcad, 
			QVector drawPos, 
			double materialDicke, 
			double zinkungsFaktor,
			double laserBreite, 
			String type,
			double aufhaengungsLaenge,
			double spiegelAuflageLaenge,
			double spiegelAuflageBreite,
			double spiegelGewicht,
			double gegenFreiraum,
			double spiegelDicke
			) 
	throws SecurityException, IOException {
		this.file4qcad=file4qcad;
		this.materialDicke=materialDicke;
		this.zinkungsFaktor=zinkungsFaktor;
		this.laserBreite=laserBreite;
		this.drawPos = new QVector(drawPos.x, drawPos.y);
		this.aufhaengungsLaenge=aufhaengungsLaenge;
		this.spiegelGewicht=spiegelGewicht;
		this.spiegelDicke=spiegelDicke;
		this.gegenFreiraum=gegenFreiraum;
		
		azimuthServo = new Servo(file4qcad, new QVector(0,0), type,materialDicke,zinkungsFaktor,laserBreite);
		
		azimuthBox = new SchachtelExt(file4qcad, 
				drawPos,
				azimuthServo.korpus.boxInnenLaenge+2*materialDicke,
				azimuthServo.korpus.boxInnenBreite+2*materialDicke,
				azimuthServo.korpus.boxInnenHoehe+2*materialDicke,
				aufhaengungsLaenge,
				materialDicke,zinkungsFaktor,laserBreite);
		
		azimuthServo.korpusOO.positionIntoServoBox(azimuthBox, ServoKorpus.intoGrundplatte);
		
		elevationBox = new SchachtelExt(
				file4qcad,
				new QVector(0,-(azimuthBox.hoehe+azimuthBox.breite+6*materialDicke)),
				azimuthBox.laenge,
				azimuthBox.hoehe,
				azimuthBox.hoehe+azimuthServo.korpusOO.servoProtruding+(3*materialDicke),
				azimuthServo.korpusOO.gegenAchseRadius+
				azimuthServo.korpusOO.diagFromRudderCenter+
				azimuthServo.rudder.length+azimuthServo.rudder.extraMargin,
				materialDicke,
				zinkungsFaktor,
				laserBreite						
		);
		
		azimuthServo.rudderOO.positionIntoGegenBoxExt(elevationBox,azimuthServo.korpusOO);
		
		elevationServo = new Servo(file4qcad, new QVector(0,0), type,materialDicke,zinkungsFaktor,laserBreite);
		
		elevationServo.korpusOO.positionIntoServoBox(elevationBox, ServoKorpus.intoLaengenPlatte);
		
		double spiegelArmLaenge=elevationServo.korpusOO.gegenAchseRadius+
		elevationServo.korpusOO.diagFromRudderCenter+
		elevationServo.rudder.length+azimuthServo.rudder.extraMargin;
		
		double spiegelMaulBreite=elevationBox.breite+elevationServo.korpusOO.servoProtruding+(3*materialDicke);
		
		
		spiegelBox = new SchachtelExt(
				file4qcad,
				new QVector(0,-(azimuthBox.hoehe+azimuthBox.breite+6*materialDicke + elevationBox.hoehe+elevationBox.breite+8*materialDicke)),
				spiegelAuflageLaenge,
				spiegelAuflageBreite,
				spiegelMaulBreite,
				spiegelArmLaenge,
				materialDicke,
				zinkungsFaktor,
				laserBreite						
		);
		spiegelBox.zusatzAbstandGP2LP=200;
		spiegelBox.init();
		
		
		elevationServo.rudderOO.positionIntoGegenBoxExt(spiegelBox, elevationServo.korpusOO);
		
	    double distAchse2Rand=spiegelBox.platteOODP.ecke[2].x-elevationServo.rudderOO.gegenBoxAchse.x;
				
		gegenGewicht = new GegenGewicht(
							this.spiegelGewicht,
							// \/spiegelFrontabstand=ssx
							(elevationServo.rudderOO.gegenAufhaengung.center.x-spiegelBox.platteOOGP.ecke[0].x)+this.spiegelDicke/2,
							// \/gegenGewichtErniedrigung=sgy
							elevationBox.hoehe/2,
							distAchse2Rand,
							this.gegenFreiraum,
							// \/Schachtelhoehe fuer Gegenbox
							elevationBox.breite+elevationServo.korpusOO.servoProtruding+(3*materialDicke),
							materialDicke							
						);
		
		verbindungsRechteck=new Rectangle(file4qcad, 
											new QVector(spiegelBox.platteOODP.ecke[0].x,
													spiegelBox.platteOODP.ecke[0].y-160	
													),
											gegenGewicht.querBrettBreite,
											gegenGewicht.querBrettLaenge);
				
		gegenGewichtBox = new SchachtelExt(file4qcad,
				new QVector(
						spiegelBox.platteOODP.ecke[1].x+10*materialDicke,-(
						azimuthBox.hoehe+azimuthBox.breite+6*materialDicke + elevationBox.hoehe+elevationBox.breite+8*materialDicke)),
						gegenGewicht.schachtelLaenge,
						gegenGewicht.schachtelBreite,
						gegenGewicht.schachtelHoehe,						
						gegenGewicht.schachtelExtension,
						materialDicke,
						zinkungsFaktor,
						laserBreite	
				
				);
		gegenGewichtBox.zusatzAbstandGP2LP=130;
		gegenGewichtBox.init();
		
	}
	
	
	
		
	
	public void draw() {
		azimuthBox.draw();	
		azimuthServo.korpusOO.draw();
		azimuthServo.korpusOO.drawRudderHoleAtBox(azimuthServo.rudder);
		azimuthServo.korpusOO.drawGegenAchse();
		drawAziBoxJamaica();
		//servoBox.drawServoJamaica();
		
		elevationBox.draw();		
		azimuthServo.rudderOO.draw();
		
		elevationServo.korpusOO.draw();
		elevationServo.korpusOO.drawGegenAchse();
		elevationServo.korpusOO.drawRudderHoleAtBox(elevationServo.rudder);
		drawElvBoxJamaica();
		
		spiegelBox.draw();
		elevationServo.rudderOO.draw();
		
		verbindungsRechteck.draw();
		
		gegenGewichtBox.draw();
		drawSpiegelJamaica();
		
		
	}
	
	public void drawAziBoxJamaica() {
		
		double luxbp1=azimuthBox.laengenPlatteHinten.ecke[0].x+2*materialDicke;
		double luybp1=azimuthBox.laengenPlatteHinten.ecke[0].y+1.5*materialDicke; 
		double roxbp1=azimuthBox.laengenPlatteHinten.ecke[2].x-2*materialDicke; 
		double roybp1=azimuthBox.laengenPlatteHinten.ecke[2].y-1.5*materialDicke; 
		PlatteOOExt.drawJamaica(file4qcad, new QVector(luxbp1,luybp1), new QVector(roxbp1,roybp1), materialDicke);
		
		luxbp1=azimuthBox.laengenPlatteVorne.ecke[0].x+2*materialDicke;
		luybp1=azimuthBox.laengenPlatteVorne.ecke[0].y+1.5*materialDicke; 
		roxbp1=azimuthBox.laengenPlatteVorne.ecke[2].x-2*materialDicke; 
		roybp1=azimuthBox.laengenPlatteVorne.ecke[2].y-1.5*materialDicke; 
		PlatteOOExt.drawJamaica(file4qcad, new QVector(luxbp1,luybp1), new QVector(roxbp1,roybp1), materialDicke);
		
		luxbp1=azimuthBox.breitenPlatteLinks.ecke[0].x+1.5*materialDicke;
		luybp1=azimuthBox.breitenPlatteLinks.ecke[0].y+1.5*materialDicke; 
		roxbp1=azimuthBox.breitenPlatteLinks.ecke[2].x-1.5*materialDicke; 
		roybp1=azimuthBox.breitenPlatteLinks.ecke[2].y-1.5*materialDicke; 
		Rectangle breiteLinksRect = new Rectangle(file4qcad, new QVector(luxbp1,luybp1),new QVector(roxbp1,roybp1));
		breiteLinksRect.draw();
		
		luxbp1=azimuthBox.breitenPlatteRechts.ecke[0].x+1.5*materialDicke;
		luybp1=azimuthBox.breitenPlatteRechts.ecke[0].y+1.5*materialDicke; 
		roxbp1=azimuthBox.breitenPlatteRechts.ecke[2].x-1.5*materialDicke; 
		roybp1=azimuthBox.breitenPlatteRechts.ecke[2].y-1.5*materialDicke; 
		Rectangle breiteRechtsRect = new Rectangle(file4qcad, new QVector(luxbp1,luybp1),new QVector(roxbp1,roybp1));
		breiteRechtsRect.draw();
						
		
	}
	
	public void drawElvBoxJamaica() {
		double lux=elevationServo.korpusOO.gegenAchseCenter.x+2*materialDicke;
		double luy=elevationBox.laengenPlatteHinten.ecke[0].y+1.5*materialDicke; 
		double rox=elevationBox.laengenPlatteHinten.ecke[2].x-1.5*materialDicke; 
		double roy=elevationBox.laengenPlatteHinten.ecke[2].y-1.5*materialDicke; 
		PlatteOOExt.drawJamaica(file4qcad, new QVector(lux,luy), new QVector(rox,roy), materialDicke);
		
		
		double luxbp2=elevationBox.breitenPlatteRechts.ecke[0].x+1.5*materialDicke;
		double luybp2=elevationBox.breitenPlatteRechts.ecke[0].y+1.5*materialDicke; 
		double roxbp2=elevationBox.breitenPlatteRechts.ecke[2].x-1.5*materialDicke; 
		double roybp2=elevationBox.breitenPlatteRechts.ecke[2].y-1.5*materialDicke; 
		Rectangle breiteRechtsRect = new Rectangle(file4qcad, new QVector(luxbp2,luybp2),new QVector(roxbp2,roybp2));
		breiteRechtsRect.draw();		
		//PlatteOOExt.drawJamaica(file4qcad, new QVector(luxbp2,luybp2), new QVector(roxbp2,roybp2), materialDicke);
		
		luxbp2=elevationBox.breitenPlatteLinks.ecke[0].x+1.5*materialDicke;
		luybp2=elevationBox.breitenPlatteLinks.ecke[0].y+1.5*materialDicke; 
		roxbp2=elevationBox.breitenPlatteLinks.ecke[2].x-1.5*materialDicke; 
		roybp2=elevationBox.breitenPlatteLinks.ecke[2].y-1.5*materialDicke; 
		Rectangle breiteLinksRect = new Rectangle(file4qcad, new QVector(luxbp2,luybp2),new QVector(roxbp2,roybp2));
		breiteLinksRect.draw();	
		//PlatteOOExt.drawJamaica(file4qcad, new QVector(luxbp2,luybp2), new QVector(roxbp2,roybp2), materialDicke);	
	
	
		luxbp2=elevationBox.platteOOGP.ecke[0].x+2*materialDicke;
		luybp2=elevationBox.platteOOGP.ecke[0].y+2*materialDicke; 
		roxbp2=elevationBox.platteOOGP.randlinie[1].endPos.x-2*materialDicke; 
		roybp2=elevationBox.platteOOGP.randlinie[1].endPos.y-2*materialDicke; 
		PlatteOOExt.drawJamaica(file4qcad, new QVector(luxbp2,luybp2), new QVector(roxbp2,roybp2), materialDicke);
		
		luxbp2=elevationBox.platteOODP.ecke[0].x+2*materialDicke;
		luybp2=elevationBox.platteOODP.ecke[0].y+2*materialDicke; 
		roxbp2=elevationBox.platteOODP.randlinie[1].endPos.x-2*materialDicke; 
		roybp2=elevationBox.platteOODP.randlinie[1].endPos.y-2*materialDicke; 
		PlatteOOExt.drawJamaica(file4qcad, new QVector(luxbp2,luybp2), new QVector(roxbp2,roybp2), materialDicke);
		
		
	}
	
	public void drawSpiegelJamaica() {
		
		double luxbp2=spiegelBox.breitenPlatteRechts.ecke[0].x+1.5*materialDicke;
		double luybp2=spiegelBox.breitenPlatteRechts.ecke[0].y+1.5*materialDicke; 
		double roxbp2=spiegelBox.breitenPlatteRechts.ecke[2].x-1.5*materialDicke; 
		double roybp2=spiegelBox.breitenPlatteRechts.ecke[2].y-1.5*materialDicke; 
		PlatteOOExt.drawJamaica(file4qcad, new QVector(luxbp2,luybp2), new QVector(roxbp2,roybp2), materialDicke);
		
		luxbp2=spiegelBox.breitenPlatteLinks.ecke[0].x+1.5*materialDicke;
		luybp2=spiegelBox.breitenPlatteLinks.ecke[0].y+1.5*materialDicke; 
		roxbp2=spiegelBox.breitenPlatteLinks.ecke[2].x-1.5*materialDicke; 
		roybp2=spiegelBox.breitenPlatteLinks.ecke[2].y-1.5*materialDicke; 
		PlatteOOExt.drawJamaica(file4qcad, new QVector(luxbp2,luybp2), new QVector(roxbp2,roybp2), materialDicke);
		
		
		drawGegenBoxHoles();
			
	}
	
	public void drawGegenBoxHoles() {
		
		deckelLoch[0]=new Circle(file4qcad, new QVector(
				                 gegenGewichtBox.laengenPlatteHinten.center.x,
				                 gegenGewichtBox.laengenPlatteHinten.center.y+4),2);
		
		deckelLoch[1]=new Circle(file4qcad, new QVector(
                gegenGewichtBox.laengenPlatteHinten.center.x,
                gegenGewichtBox.laengenPlatteHinten.center.y-4),2);
		
		for (int i=0;i<deckelLoch.length;i++)
			 deckelLoch[i].draw();
		
	}
	

}
